import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import monacoEditorPlugin from 'vite-plugin-monaco-editor'
import { axiosPre } from './src/settings/httpSetting'
import { viteMockServe } from 'vite-plugin-mock'
import viteCompression from 'vite-plugin-compression'
import { OUTPUT_DIR, terserOptions, rollupOptions, brotliSize, chunkSizeWarningLimit } from './build/constant'

function pathResolve(dir: string) {
  return resolve(process.cwd(), '.', dir)
}

export default defineConfig(({ mode }) => {
  return {
    base: process.env.NODE_ENV === 'production' ? './' : '/',
    resolve: {
      alias: [
        {
          find: /\/#\//,
          replacement: pathResolve('types')
        },
        {
          find: '@',
          replacement: pathResolve('src')
        },
        {
          find: 'vue-I18n',
          replacement: 'vue-I18n/dist/vue-I18n.cjs.js' // 解决i18n警告
        }
      ],
      // 如果你在你的应用程序中有相同依赖的副本（比如 monorepos），请使用此选项强制 Vite 始终将列出的依赖项解析为同一副本（从项目根目录）。
      dedupe: ['vue']
    },
    // 全局scss注册
    css: {
      preprocessorOptions: {
        scss: {
          javascriptEnabled: true,
          additionalData: `@import "src/styles/common/style.scss";`
        }
      }
    },
    // 开发服务器配置
    server: {
      host: true,
      open: false,
      port: 3000,
      proxy: {
        [axiosPre]: {
          target: loadEnv(mode, process.cwd()).VITE_DEV_PATH,
          changeOrigin: true,
          ws: true,
          secure: true
        }
      }
    },
    plugins: [
      vue(),
      monacoEditorPlugin({
        languageWorkers: ['editorWorkerService', 'typescript', 'json', 'html']
      }),
      viteMockServe({
        mockPath: '/src/api/mock',
        // 开发打包开关
        localEnabled: true,
        // 生产打包开关
        prodEnabled: true,
        // 打开后，可以读取ts文件，但是无法监视js文件
        supportTs: true,
        // 监视文件
        watchFiles: true
      }),
      viteCompression({
        // 控制台输出压缩结果
        verbose: true,
        // 开启压缩
        disable: false,
        // 对大于1M的文件压缩
        threshold: 10240,
        // gzip压缩算法
        algorithm: 'gzip',
        // 压缩文件后缀
        ext: '.gz'
      })
    ],
    // 构建相关配置
    build: {
      target: 'es2015',
      outDir: OUTPUT_DIR,
      minify: 'terser',
      terserOptions: terserOptions,
      rollupOptions: rollupOptions,
      brotliSize: brotliSize,
      chunkSizeWarningLimit: chunkSizeWarningLimit
    }
  }
})
